package com.zmn.plat.persistence.interfaces.servcategory;

import com.zmn.common.dto.KvDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.plat.model.entity.category.BaseCategory;
import com.zmn.plat.model.entity.servcategory.ServAssCategory;
import com.zmn.plat.model.entity.servcategory.ServAssCategoryQuery;
import com.zmn.plat.model.entity.servcategory.ServCategory;
import com.zmn.plat.model.entity.servcategory.ServTariffAssCategoryQuery;
import com.zmn.plat.model.vo.servcategory.CategoryProductGroupVO;
import com.zmn.plat.model.vo.servcategory.ServAssCategoryVO;
import com.zmn.plat.model.vo.servcategory.ServCategoryVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author duanzuocai
 * @version v1.0
 * @类说明：服务-分类关联
 * @since 2018/10/23 15:00
 */
public interface ServAssCategoryDao {

    /**
     * 根据主键ID查找分类关联关系
     *
     * @param groupId
     * @return
     */
    ServAssCategory findByKey(Integer groupId);

    /**
     * 描述: 根据服务分类ID和前台台二级产品分类ID、业务类型查询产品组信息
     * 根据前台分类查询其关联的后台分类ID，并取对应后台分类有配置对应业务类型的产品组信息（取第一条）
     *
     * @param servCategId    服务分类ID
     * @param showCategTwoId 前台二级产品分类ID
     * @param bizType        业务类型
     * @return VtDTO(groupId, groupName)
     * @auther tanghongjun
     * @since 2020/9/11
     */
    VtDTO findProductGroupVtByShowCategId(@Param("servCategId") Integer servCategId, @Param("showCategTwoId") Integer showCategTwoId, @Param("bizType") Integer bizType);

    /**
     * 查询一级分类
     *
     * @param servId 服务分类
     * @return
     */
    List<BaseCategory> findCategoryOneByServId(Integer servId);

    /**
     * 查询一级分类
     *
     * @param servId   服务分类
     * @param showType 产品类型 1 后端 2前端
     * @return
     */
    List<BaseCategory> findCategoryOneByServIdAndShowType(@Param("servCategId") Integer servId, @Param("showType") Integer showType);

    /**
     * 根据服务分类ID查询二级分类
     *
     * @param servId 服务分类
     * @return
     */
    List<BaseCategory> findCategoryTwoByServId(Integer servId);

    /**
     * 根据服务分类ID查询二级分类
     *
     * @param servId   服务分类
     * @param showType 产品类型 1 后端 2前端
     * @return
     */
    List<BaseCategory> findCategoryTwoByServIdAndShowType(@Param("servCategId") Integer servId, @Param("showType") Integer showType);

    /**
     * 根据服务分类ID和品牌Id和前后台类型查询产品二级分类  规则：根据品牌与前台产品分类的关联关系，以及前后台服务品类关联关系，过滤可配置系数的后台产品分类
     *
     * @param servId
     * @param brandId
     * @param showType
     * @return
     */
    List<BaseCategory> findCategoryTwoByServIdAndBrandIdAndShowType(@Param("servCategId") Integer servId, @Param("brandId") Integer brandId, @Param("showType") Integer showType);

    /**
     * 根据品牌ID和前后台类型查询符合条件的服务分类：规则：根据品牌与前台产品分类的关联关系，以及前后台服务品类关联关系，过滤可配置系数的后台服务分类
     *
     * @param brandId
     * @param showType
     * @return
     */
    List<ServCategory> findServCategoryByBrandIdAndShowType(@Param("brandId") Integer brandId, @Param("showType") Integer showType);

    /**
     * 从产品表查启用的二级分类
     *
     * @param servCategId
     * @param categOneId
     * @return
     */
    List<KvDTO> findCategFromProduct(@Param("servCategId") Integer servCategId, @Param("categOneId") Integer categOneId);

    /**
     * 统计
     *
     * @param query 条件
     * @return
     */
    Integer countByQuery(ServAssCategoryQuery query);

    /**
     * 描述: 根据后台产品一级分类分组统计
     *
     * @param query
     * @return: Integer
     * @auther: tanghongjun
     * @since: 2019/9/21 16:41
     */
    Integer countGroupByCategOneId(ServTariffAssCategoryQuery query);

    /**
     * 根据预生效时间查询数据
     *
     * @param perTime 预生效时间
     * @return 符合条件的数据集合
     */
    List<ServAssCategoryVO> listByPerTime(@Param("perTime") Date perTime);

    /**
     * 分页搜索分类关联服务
     *
     * @param query 条件
     * @return
     */
    List<ServAssCategoryVO> listPageByQuery(ServAssCategoryQuery query);

    /**
     * 描述: 根据后台产品一级分类分组分页
     *
     * @param query
     * @return: List<ServAssCategoryVO>
     * @auther: tanbiao
     * @since: 2019/11/25 16:41
     */
    List<ServAssCategoryVO> listPageGroupByCategOneId(ServTariffAssCategoryQuery query);

    /**
     * 搜索
     *
     * @param query 条件
     * @return
     */
    List<ServAssCategoryVO> listByQuery(ServAssCategoryQuery query);

    /**
     * 查询后台品类与产品组关联关系
     *
     * @return
     */
    List<CategoryProductGroupVO> listCategoryAndProductGroup();

    /**
     * 根据产品组ID查询被使用的产品组ID
     *
     * @param groupIds 产品组ID集合
     * @return List<Integer> 分类关联使用到的产品组
     */
    List<Integer> listProductGroupIdOfUsed(@Param("groupIds") List<Integer> groupIds);

    /**
     * 所有一二级服务关联关系
     *
     * @return
     */
    List<ServCategoryVO> listClassificationLevelTwo();

    /**
     * 前台所有一二级服务关联关系
     *
     * @return
     */
    List<ServCategoryVO> listClassificationLevelTwoForShow();

    /**
     * 根据servId查询二级分类以及所属一级分类
     *
     * @return
     */
    List<ServCategoryVO> findServAssCategoryByServIdAndShowType(@Param("servCategId") Integer servCategId, @Param("showType") Integer showType);


    /**
     * 修改描述
     *
     * @param id
     * @param desc
     */
    void updateDesc(@Param("id") Integer id, @Param("desc") String desc);

    /**
     * 更新免责条款
     *
     * @param id
     * @param disclaimer
     */
    void updateDisclaimer(@Param("id") Integer id, @Param("disclaimer") String disclaimer, @Param("updater") String updater);

    /**
     * 更新产品分类
     *
     * @param servAssCategory
     */
    void updatePerBizTypeGroup(ServAssCategory servAssCategory);

    /**
     * 立即生效
     *
     * @param servAssCategory
     */
    Integer updateBizTypeGroup(ServAssCategory servAssCategory);

    /**
     * 描述: 故障项目有变更的时候，根据服务分类和一级产品分类更新修改时间
     *
     * @param servAssCategoryQuery
     * @return: 执行结果码
     * @auther: tanbiao
     * @since: 2019/11/21 16:41
     */
    Integer updateFaultUpdaterAndTimeByServCategIdAndCategOneId(ServAssCategoryQuery servAssCategoryQuery);

    /**
     * 描述: 将预生效的产品组生效
     *
     * @param servAssCategoryList
     * @return: 执行结果码
     * @auther: tanghongjun
     * @since: 2020年8月28日13:43:31
     */
    Integer updateProductGroupByKeyBatch(@Param("servAssCategoryList") List<ServAssCategory> servAssCategoryList);

    /**
     * 描述：根据关联关系主键添加故障现象
     *
     * @param groupId  主键
     * @param fault    故障现象json
     * @param operator 操作人
     */
    void updateFaultByGroupId(@Param("groupId") Integer groupId, @Param("fault") String fault, @Param("operator") String operator);


    /**
     * 描述：根据关联关系主键添加验收项目
     *
     * @param groupId  主键
     * @param engineer 工程师验收项目json
     * @param user     用户验收项目json
     * @param operator 操作人
     */
    void updateEngineerAcceptProjectAndUserAcceptProjectByGroupId(@Param("groupId") Integer groupId, @Param("engineer") String engineer,
                                                                  @Param("user") String user, @Param("operator") String operator);
    /**
     * 描述：根据关联关系主键添加服务内容
     *
     * @param groupId  主键
     * @param serviceContent 服务内容
     * @param operator 操作人
     */
    void updateServiceContentByGroupId(@Param("groupId") Integer groupId,@Param("serviceContent") String serviceContent, @Param("operator") String operator);
    /**
     * 描述：根据关联关系主键添加检修提示
     *
     * @param groupId  主键
     * @param tstDrip 服务内容
     * @param operator 操作人
     */
    void updateTstDripByGroupId(@Param("groupId")Integer groupId, @Param("tstDrip")String tstDrip, @Param("operator")String operator);
    /**
     * 添加关联
     *
     * @param category 对象
     * @return
     */
    Integer insert(ServAssCategory category);

    /**
     * 批量添加关联
     *
     * @param list 对象
     * @return
     */
    Integer insertBatch(@Param("list") List<ServAssCategory> list);

    /**
     * 删除关联
     *
     * @param ids id's
     * @return
     */
    Integer deleteByKeys(@Param("ids") List<Integer> ids);

    /**
     * 根据servId和showType删除产品关联关系
     *
     * @return
     */
    Integer deleteByServId(@Param("servCategId") Integer servCategId, @Param("showType") Integer showType);

}
